// 动态内存
/*C++ 程序中的内存分为两个部分：
栈：在函数内部声明的所有变量都将占用栈内存。
堆：这是程序中未使用的内存，在程序运行时可用于动态分配内存。
*/
#include <iostream>
using namespace std;

int main()
{
    // 第一维为 i， 第二维为 j， 第三维为k
    int i, j, k; // p[2][3][4]

    int ***p=NULL; // 初始化为NULL，防止野指针
    p = new int **[2];//new在运行时分配堆内的内存，还创建对象
    for (i = 0; i < 2; i++)
    {
        p[i] = new int *[3];
        for (j = 0; j < 3; j++)
            p[i][j] = new int[4];
    }

    // 输出 p[i][j][k] 三维数据
    for (i = 0; i < 2; i++)
    {
        for (j = 0; j < 3; j++)
        {
            for (k = 0; k < 4; k++)
            {
                p[i][j][k] = i + j + k;
                cout << p[i][j][k] << " ";
            }
            cout << endl;
        }
        cout << endl;
    }

    // 释放内存
    for (i = 0; i < 2; i++)
    {
        for (j = 0; j < 3; j++)
        {
            delete[] p[i][j];//delete删除由new创建的对象，释放内存
        }
    }
    for (i = 0; i < 2; i++)
    {
        delete[] p[i];//delete[]删除数组。
    }
    delete[] p;//class对象与简单数据类型的区别只在class对象的析构函数会被调用，而简单数据类型不会。
    return 0;
}